import axios from "axios"; // 引入axios
import qs from "qs";
import store from "@/store/store";
import router from "@/router";
import Vue from "vue";
const vm = new Vue();

//请求配置
// axios.defaults.timeout = 60000;
axios.defaults.timeout = 10000;
// axios.defaults.baseURL =  process.env.VUE_APP_BASE_API;
// axios.defaults.withCredentials = true;

// YU 实验方法！！
axios.defaults.retry = 4;
axios.defaults.retryDelay = 3000

//请求拦截
axios.interceptors.request.use(
  config => {
    // token
    // if (store.getters.token) {
    //   config.headers['token'] = getToken()
    // }
    // if(config['headers']['app-key']){
      config.headers['app-key'] = 'FB';
    // }
    if(localStorage.getItem('token')){
      config.headers['token'] = localStorage.getItem('token');
    }
    // config.headers['token'] = 'FB'
    return config;
  },
  error => {
    return Promise.reject(error);
  }
);

// 响应拦截
axios.interceptors.response.use(
  response => {
    // 如果返回success为true，说明接口请求成功，可以正常拿到数据，否则的话抛出错误
    if (response.data.success ||response.data.code===200) {
      return Promise.resolve(response);
    } else {
      console.log('看看怎么回事',response)
      // 对切换视图接口做特殊处理
      if(response.request.responseURL == "http://116.8.3.152:38084/msa-auth/permission/api/perm/user/view/all" && response.data.success == false){
        // 清除本地所有缓存
        window.localStorage.clear()
        vm.$vs.notify({
          text: '身份过期,请重新登录',
          color: "danger",
          icon: "error"
        });
        setTimeout(() => {
          router.replace({
            path: "/pages/login"
          });
        }, 1000);

        return false;
      }

      //统一处理接口报错
      // 限制弹出框多次弹出
      if (document.getElementsByClassName('vs-notifications').length === 0  && response.config.url != "http://116.8.3.152:38084/sbm-srv/health_monitoring/queryRealDataBySensorId") {
        vm.$vs.notify({
          text: response.data.message,
          // text: '网络波动请重试',
          color: "danger",
          icon: "error"
        });
      }

      return Promise.reject(response);
    }
  },
  //错误状态码
  error => {
    if (error.response && error.response.data.errorCode) {
      switch (error.response.data.errorCode) {
        case 5000:
          this.$vs.notify({
            text: `${error.response.data.message}`
          });
          break;
        // 403 token过期
        case 403:
          // 清除token
          localStorage.removeItem("token");
          // 跳转登录页面，并将要浏览的页面fullPath传过去，登录成功后跳转需要访问的页面
          setTimeout(() => {
            router.replace({
              path: "/pages/login",
              query: {
                redirect: router.currentRoute.fullPath
              }
            });
          }, 1000);
          break;

        case 404:
          break;
        // 其他错误，直接抛出错误提示
        default:
      }
      return Promise.reject(error.response);
    } else {
      if (document.getElementsByClassName('vs-notifications').length === 0 ) {
        // vm.$vs.notify({
        //   text: "网络连接失败",
        //   color: "danger",
        //   icon: "error"
        // });
      }
       // YU 新加的超时处理方法！！！
      // if(error.code === 'ECONNABORTED' && error.message.indexOf('timeout') !== -1) {
      //   console.log('根据你设置的timeout/真的请求超时 判断请求现在超时了')
      //   vm.$vs.notify({
      //     text: "数据请求超时！",
      //     color: "danger",
      //     icon: "danger"
      //   });
      // }
      return Promise.reject(error);
    }
  },
  // YU 实验解决方案
  // function axiosRetryInterceptor(error) {
  //   var config = error.config;
  //   // If config does not exist or the retry option is not set, reject
  //   if(!config || !config.retry) return Promise.reject(error);
  //
  //   // Set the variable for keeping track of the retry count
  //   config.__retryCount = config.__retryCount || 0;
  //
  //   // Check if we've maxed out the total number of retries
  //   if(config.__retryCount >= config.retry) {
  //     // Reject with the error
  //     return Promise.reject(error);
  //   }
  //
  //   // Increase the retry count
  //   config.__retryCount += 1;
  //
  //   // Create new promise to handle exponential backoff
  //   var backoff = new Promise(function(resolve) {
  //     setTimeout(function() {
  //       resolve();
  //     }, config.retryDelay || 1);
  //   });
  //
  //   // Return the promise in which recalls axios to retry the request
  //   return backoff.then(function() {
  //     return axios(config);
  //   });
  // }
);

// YU 修改！
// axios.interceptors.response.use(undefined, function axiosRetryInterceptor(err) {
//   var config = err.config;
//   // If config does not exist or the retry option is not set, reject
//   if(!config || !config.retry) return Promise.reject(err);
//
//   // Set the variable for keeping track of the retry count
//   config.__retryCount = config.__retryCount || 0;
//
//   // Check if we've maxed out the total number of retries
//   if(config.__retryCount >= config.retry) {
//     // Reject with the error
//     // YU 增加提示语（不过多接口超时，好像提示又不友好！）
//     //   vm.$vs.notify({
//     //     text: "数据请求超时！",
//     //     color: "danger",
//     //     icon: "danger"
//     //   });
//     // console.log(err)
//     // console.log('数据请求超时！')
//     return Promise.reject(err);
//   }
//
//   // Increase the retry count
//   config.__retryCount += 1;
//
//   // Create new promise to handle exponential backoff
//   var backoff = new Promise(function(resolve) {
//     setTimeout(function() {
//       resolve();
//     }, config.retryDelay || 1);
//   });
//
//   // Return the promise in which recalls axios to retry the request
//   return backoff.then(function() {
//     return axios(config);
//   });
// });


/**
 * 封装get请求
 * @param {String} url [请求的url地址]
 * @param {Object} params [请求时携带的参数]
 * @returns {Promise}
 */
// export function get(url, params = {}) {
//   return new Promise((resolve, reject) => {
//     axios
//       .get(url, params)
//       .then(res => {
//         resolve(res);
//       })
//       .catch(err => {
//         reject(err.data);
//       });
//   });
// }

// /**
//  * 封装post请求
//  * @param {String} url [请求的url地址]
//  * @param {Object} params [请求时携带的参数]
//  * @returns {Promise}
//  */
// export function post(url, params = {}) {
//   return new Promise((resolve, reject) => {
//     axios
//       .post(url, qs.stringify(params))
//       .then(res => {
//         resolve(res.data);
//       })
//       .catch(err => {
//         reject(err.data);
//       });
//   });
// }

/**
 * 封装put请求
 * @param url
 * @param data
 * @returns {Promise}
 */

export function put(url, data = {}) {
  return new Promise((resolve, reject) => {
    axios.put(url, data).then(
      response => {
        resolve(response.data);
      },
      err => {
        reject(err);
      }
    );
  });
}

export default axios;
